/* Araujo Heiker CI. 19726991
 * Goyo Willandher CI.20666542
 * Rodriguez Rafael CI.20009872
 * Williams Roman CI.20016812 
 * Morett Gilberth CI.20929667*/

package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;

import vista.VentanaFacturaCompra;

import modelo.*;

public class ControladorVentanaFacturaCompra implements ActionListener,
		KeyListener, FocusListener {
	private VentanaFacturaCompra ventanafacturacompra;
	private Drogueria drogueria;
	private String imec;
	private String codigo;

	public ControladorVentanaFacturaCompra(Drogueria drogueria, String imec,
			String codigo) {
		this.drogueria = drogueria;
		ventanafacturacompra = new VentanaFacturaCompra();
		ventanafacturacompra.setLocationRelativeTo(null);
		ventanafacturacompra.setVisible(true);
		ventanafacturacompra.agregarListener(this);
		ventanafacturacompra.agregarKeyListener(this);
		ventanafacturacompra.asignarFocusListener(this);
		this.codigo = codigo;
		this.imec = imec;
		this.inicializarVentana();
		ventanafacturacompra.validarFecha();
	}

	public ControladorVentanaFacturaCompra() {
	}

	// Prepara la ventana que se iniciara dependiendo de su parametro
	// alfanumerico recibido
	public void inicializarVentana() {
		if (imec.equals("Consultar")) {
			ventanafacturacompra.ponerEneableComponentesDeFacturaCompra();
			int indice = drogueria.buscarFacturaCompra(codigo);
			FacturaCompra f = drogueria.getUnaFacturaCompra(indice);
			String numeroFactura = f.getNumeroFactura();
			String nombreProveedor = f.getProveedor().getNombre();
			String rifCedula = f.getProveedor().getId();
			String direccion = f.getProveedor().getDireccion();
			ventanafacturacompra.setJtxtNumeroFactura(numeroFactura);
			ventanafacturacompra.setJtxtNombre(nombreProveedor);
			ventanafacturacompra.setJtxtRifCedula(rifCedula);
			ventanafacturacompra.setJtxtDireccion(direccion);
			ventanafacturacompra.setjDateChooser1(f.getFechaEmision());
			for (int i = 0; i < f.getItemCompras().size(); i++) {
				Vector<String> campos = new Vector<String>(3, 1);
				ItemCompra item = f.getItemCompra(i);
				String producto = item.getProducto().getNombre() + " "
						+ item.getProducto().getCodigoProducto();
				String cantidad = String.valueOf(item.getCantidad());
				DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
				String fecha = dateFormat.format(item.getFechaVencimiento());
				campos.add(producto);
				campos.add(cantidad);
				campos.add(fecha);
				ventanafacturacompra.agregarItemProductoA(campos);
			}
		} else if (imec.equals("Incluir")) {
			provandoProveedores();
			llenarCombo();
		}
	}

	@Override
	// Ejecuta las instrucciones dependiendo de los botones que se han generado
	// en la ventana factura compra
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equalsIgnoreCase("Agregar")) {
			agregarInformacionTabla();
		} else if (e.getActionCommand().equalsIgnoreCase("Guardar")) {
			boolean valor = guardarFacturaCompra();
			if (valor)
				clickGuardar();
		} else if (e.getActionCommand().equalsIgnoreCase("Cancelar")) {
			if (ventanafacturacompra.retornarFilaSelecionada() >= 0) {
				ventanafacturacompra
						.eliminarFilaTblItemCompra(ventanafacturacompra
								.retornarFilaSelecionada());
			} else {
				ventanafacturacompra
						.mostrarMensaje("Debe seleccionar un Item de la tabla");
				return;
			}
		} else if (e.getActionCommand().equalsIgnoreCase("txt")) {
			buscarProveedorYAsignarlo(ventanafacturacompra.getJtxtRifCedula());
		}
		else if(e.getActionCommand().equalsIgnoreCase("Salir")){
			ventanafacturacompra.dispose();
			new ControladorVentanaFacturaPrincipal(drogueria);
		}

	}

	public boolean guardarFacturaCompra() {
		if(ventanafacturacompra.getJtxtRifCedula().equals("")){
		ventanafacturacompra.mostrarMensaje("Debe Ingresar los datos del proveedor");
		return false;
		}
		if(ventanafacturacompra.getJtxtNumeroFactura().equals("")){
			ventanafacturacompra.mostrarMensaje("Debe Ingresar el numro de la factura");
			return false;
			}
		if (ventanafacturacompra.Cantidadfilas() > 0) {
			FacturaCompra factura = new FacturaCompra();
			String numeroFactura = ventanafacturacompra.getJtxtNumeroFactura();
			factura.setNumeroFactura(numeroFactura);
			String rifcedula = ventanafacturacompra.getJtxtRifCedula();
			int index = drogueria.buscarProveedor(rifcedula);
			Proveedor proveedor = drogueria.getUnProveedor(index);
			factura.setProveedor(proveedor);

			for (int i = 0; i < ventanafacturacompra.Cantidadfilas(); i++) {
				Producto producto = new Producto();
				Vector<String> itemArreglo = new Vector<String>(3, 1);
				itemArreglo = ventanafacturacompra.retornarItemCompra(i);
				String codigo = itemArreglo.get(0).substring(0, 4);
				int index1 = drogueria.buscarProducto(codigo);
				producto = drogueria.getUnProducto(index1);
				ItemCompra itemcompra = new ItemCompra();
				itemcompra.setProducto(producto);
				int cantida = Integer.parseInt(itemArreglo.get(1));
				int cantidadGuardadaReal = drogueria.getUnProducto(index1)
						.getCantidadReal();
				int cantidadGuardadaDisp = drogueria.getUnProducto(index1)
						.getCantidadDisponible();
				cantidadGuardadaDisp = cantidadGuardadaDisp + cantida;
				cantidadGuardadaReal = cantidadGuardadaReal + cantida;
				drogueria.getUnProducto(index1).setCantidadDisponible(
						cantidadGuardadaDisp);
				drogueria.getUnProducto(index1).setCantidadReal(
						cantidadGuardadaReal);
				itemcompra.setCantidad(cantida);
				String fechavencimiento = itemArreglo.get(2);
				Date fechadate = ventanafacturacompra
						.DeStringADate(fechavencimiento);
				itemcompra.setFechaVencimiento(fechadate);
				factura.guardar(itemcompra);
			}
			factura.setFechaEmision(ventanafacturacompra.retornarDate());
			drogueria.incluirFacturaCompra(factura);
			ventanafacturacompra.mostrarMensaje("Factura Incluida con exito");
			return true;
		} else
			ventanafacturacompra
					.mostrarMensaje("Debe ingresar al menos un Producto");
		return false;

	}

	// prepara la informacion que se agregar en la grid de los item compras.
	public void agregarInformacionTabla() {
		if (ventanafacturacompra.getTxtcantidad().equals("") || ventanafacturacompra.retornarFechaItemCompra()==null) {
			ventanafacturacompra.mostrarMensaje("Debe llenar todos los campos");
			return;
		}
		String produ = ventanafacturacompra.getSelectedItemCbo();
		SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
		Date fecha = ventanafacturacompra.retornarFechaItemCompra2();
		String fechaString = formato.format(fecha);
		String cantidad = ventanafacturacompra.getTxtcantidad();
		Vector<String> datos = new Vector<String>(3, 1);
		datos.add(produ);
		datos.add(cantidad);
		datos.add(fechaString);
		ventanafacturacompra.agregarItemProducto(datos);
		ventanafacturacompra.limpiarCampos();
		Date fechava = null;
		ventanafacturacompra.verificarCampoFecha(fechava);

	}

	// Busca un proveedor para luego llenar los campos que se encuentran en la
	// tabla factura compra.
	public void llenarCombo() {
		for (int i = 0; i < drogueria.cantidadProductos(); i++) {
			Producto pro = drogueria.getUnProducto(i);

			if (pro.getEstatus() == 'E') {
				continue;
			}
			String item = pro.getCodigoProducto() + " " + pro.getNombre();

			ventanafacturacompra.agregarItemcmbproductos(item);

		}
	}

	// Busca un proveedor para luego llenar los campos que se encuentran en la
	// tabla factura compra.
	public void buscarProveedorYAsignarlo(String codigo) {
		provandoProveedores();

		int indexProveedor = drogueria.buscarProveedor(codigo);
		if (indexProveedor == -1) {
			int cantidad = ventanafacturacompra
					.mostrarMensajeSiNO("Desea agregar el proveedor?");
			if (cantidad == 0) {
				clickabrirpantallaproveedor();

			}
			ventanafacturacompra.setJtxtRifCedula("");
			ventanafacturacompra.dejarFocusEnTxt();
			return;
		}
		Proveedor proveedor = new Proveedor();
		proveedor = drogueria.getUnProveedor(indexProveedor);
		String nombre = proveedor.getNombre();
		String direccion = proveedor.getDireccion();
		ventanafacturacompra.llenarCamposProveedor(nombre, direccion);

	}

	@Override
	// se encarga de validar los campos.
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		if(ventanafacturacompra.getTextIdCliente().equals("")){
			
		char car = e.getKeyChar();
		if ((car < '0' || car > '9') && (car < 'a' || car > 'z')
				&& (car < 'A' || car > 'Z') && (car < ',' || car > '.')
				&& (e.getKeyCode() != KeyEvent.VK_ENTER))
			e.consume();
		}
		else{
			char car = e.getKeyChar();
			if ((car < '0' || car > '9') && (car < 'a' || car > 'z')
					&& (car < 'A' || car > 'Z') && (car < ',' || car > '.')
					&& (e.getKeyCode() != KeyEvent.VK_ENTER))
				e.consume();	
		}
		if(ventanafacturacompra.getTextCantidad().equals("")){
			
			char car = e.getKeyChar();
			if ((car < '0' || car > '9'))
				e.consume();
			}
			else{
				char car = e.getKeyChar();
				if ((car < '0' || car > '9'))
					e.consume();	
			}
	}
		

	public void provandoProveedores() {
		Proveedor proveedor = new Proveedor();
		proveedor.setId("12345");
		proveedor.setNombre("Willandher");
		proveedor.setDireccion("El pajal");
		drogueria.incluirProveedor(proveedor);
	}

	/*
	 * se encarga de abrir la ventana correspondiente a las asignaciones de los
	 * item compras en los depositos ademas de cerrar la ventana de factura
	 * compra.
	 */
	public void clickGuardar() {

		try {

			ventanafacturacompra.dispose();
			this.finalize();
		} catch (Throwable e1) {
			e1.printStackTrace();
		} finally {
			new ControladorVentanaSubItemCompra(drogueria);

		}
	}

	public void clickabrirpantallaproveedor() {

		try {

			ventanafacturacompra.dispose();
			this.finalize();
		} catch (Throwable e1) {
			e1.printStackTrace();
		} finally {
			new ControladorVentanaProveedor(drogueria);

		}
	}

	@Override
	public void focusGained(FocusEvent e) {
		// TODO Auto-generated method stub
		ventanafacturacompra.validarFechaVencimiento();
	}

	@Override
	public void focusLost(FocusEvent e) {
		buscarProveedorYAsignarlo(ventanafacturacompra.getJtxtRifCedula());

	}

	void validarGuardarFactura() {
		if (ventanafacturacompra.getJtxtNumeroFactura().equals("")) {
			ventanafacturacompra
					.mostrarMensaje("Debe Ingresar el numero de factura");
			return;
		} else if (ventanafacturacompra.getJtxtRifCedula().equals("")) {
			ventanafacturacompra
					.mostrarMensaje("Debe ingresar los datos del proveedor");
			return;

		} else if (ventanafacturacompra.retornarFechaEmision().equals("")) {
			ventanafacturacompra
					.mostrarMensaje("Debe ingresar la fecha de vencimiento");
			return;
		}
	}

	@Override
	public void keyPressed(KeyEvent e) {

	}

	@Override
	public void keyReleased(KeyEvent e) {
	}
}
